using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

using RRHH.Competencias.Entities;
using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer.SqlServerProvider;

namespace RRHH.Competencias.DataAccessLayer.SqlServerProvider
{
    public class DALSqlServerCurso:IDALCurso
    {
        

        public DALSqlServerCurso()
        {
           
        }

        #region Miembros de IDALABM<Curso>

        public List<Curso> Buscar(long? curso_id, string nombre, string descripcion, long? tipoCurso
                                 ,long? responsableDictado, long? responsablePropuesta, 
                                  DateTime? fechaInicio, DateTime? fechaFin, bool soloActivo)
        {

            try
            {
                
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure( "PA_ADUS_Cursos_Buscar");
                stored.AgregarParametro("@curso_id", curso_id, typeof(long));
                stored.AgregarParametro("@nombre", nombre, typeof(string));
                stored.AgregarParametro("@descripcion", descripcion, typeof(string));
                stored.AgregarParametro("@tipoCurso_id", tipoCurso, typeof(long));
                stored.AgregarParametro("@responsableDictado", responsableDictado, typeof(long));
                stored.AgregarParametro("@responsablePropuesta", responsablePropuesta, typeof(long));
                if(fechaInicio != null) stored.AgregarParametro("@fechaInicio", fechaInicio, typeof(DateTime));
                else stored.AgregarParametro("@fechaInicio", DBNull.Value, typeof(DateTime));
                if (fechaFin != null) stored.AgregarParametro("@fechaFin", fechaFin, typeof(DateTime));
                else stored.AgregarParametro("@fechaFin", DBNull.Value, typeof(DateTime));
                stored.AgregarParametro("@soloActivos", soloActivo, typeof(bool));

                return CargaLista(stored.ExecuteDataTable());

            }
            catch (Exception ex)
            {

                throw new DALException(ex.Message);

            }

        }


        public List<Curso> Buscar(Curso itemBuscar)
        {

            try
            {

                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure( "PA_ADUS_Cursos_Buscar");
                stored.AgregarParametro("@curso_id", itemBuscar.Id, typeof(long));
                stored.AgregarParametro("@nombre", itemBuscar.Nombre, typeof(string));
                stored.AgregarParametro("@descripcion", itemBuscar.Descripcion, typeof(string));
                stored.AgregarParametro("@tipoCurso_id", itemBuscar.Tipo.Id, typeof(long));
                stored.AgregarParametro("@responsableDictado", itemBuscar.ResponsableDictado.Id, typeof(long));
                stored.AgregarParametro("@responsablePropuesta", itemBuscar.ResponsablePropuesta.Id, typeof(long));
                if (itemBuscar.FechaInicio != DateTime.MinValue) stored.AgregarParametro("@fechaInicio", itemBuscar.FechaInicio, typeof(DateTime));
                else stored.AgregarParametro("@fechaInicio", DBNull.Value, typeof(DateTime));
                if (itemBuscar.FechaFin != DateTime.MinValue) stored.AgregarParametro("@fechaFin", itemBuscar.FechaFin, typeof(DateTime));
                else stored.AgregarParametro("@fechaFin", DBNull.Value, typeof(DateTime));
                stored.AgregarParametro("@soloActivos", true, typeof(bool));

                return CargaLista(stored.ExecuteDataTable());

            }
            catch (Exception ex)
            {

                throw new DALException(ex.Message);

            }

        }

        public void Completar(Curso itemCompletar) 
        {
            try
            {
                List<Curso> lsCursos = Buscar(itemCompletar);

                if (lsCursos.Count > 0)
                {
                    itemCompletar.Id = lsCursos[0].Id;
                    itemCompletar.Nombre = lsCursos[0].Nombre;
                    itemCompletar.Descripcion = lsCursos[0].Descripcion;
                    itemCompletar.ResponsableDictado = new Persona(lsCursos[0].ResponsableDictado.Id, string.Empty, string.Empty);
                    itemCompletar.ResponsablePropuesta = new Colaborador(lsCursos[0].ResponsablePropuesta.Id, string.Empty, string.Empty);
                    itemCompletar.FechaInicio = lsCursos[0].FechaInicio;
                    itemCompletar.FechaFin = lsCursos[0].FechaFin;
                    itemCompletar.CantidadHoras = lsCursos[0].CantidadHoras;
                    itemCompletar.Tipo = new TipoCurso(lsCursos[0].Tipo.Id, string.Empty, string.Empty);
                }

            }
            catch (Exception ex)
            {
                
                throw ex;
            }
        }

        public void Guardar(Curso item)
        {
            DALSqlServerConnection conexion = new DALSqlServerConnection();
            SqlTransaction transaccion = null;

            using (SqlConnection connection = conexion.Conexion)
            {
                try
                {
                    transaccion = connection.BeginTransaction();

                    using (SqlCommand command = connection.CreateCommand())
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = "PA_ADUS_Cursos_insertar";
                        command.Transaction = transaccion;
                        command.Parameters.AddWithValue("@nombre", item.Nombre);
                        command.Parameters.AddWithValue("@descripcion", item.Descripcion);
                        command.Parameters.AddWithValue("@responsablePropuesta", item.ResponsablePropuesta.IdColaborador);
                        command.Parameters.AddWithValue("@responsableDictado", item.ResponsableDictado.Id);
                        command.Parameters.AddWithValue("@tipoCurso_id", item.Tipo.Id);
                        if (item.CantidadHoras != 0) command.Parameters.AddWithValue("@cantidadHoras", item.CantidadHoras);
                        if (item.FechaInicio != DateTime.MinValue) command.Parameters.AddWithValue("@fechaInicio", item.FechaInicio);
                        else command.Parameters.AddWithValue("@fechaInicio", DBNull.Value);
                        if (item.FechaFin != DateTime.MinValue) command.Parameters.AddWithValue("@fechaFin", item.FechaFin);
                        else command.Parameters.AddWithValue("@fechaFin", DBNull.Value);

                        item.Id = Convert.ToInt32(command.ExecuteScalar());
                        command.Parameters.Clear();

                        if (item.ContarCapacidades() > 0)
                        {
                            command.CommandText = "PA_ADUS_Cursos_insertarCapacidades";
                            
                            foreach (CapacidadCurso capacidadCurso in item.Capacidades)
                            {
                                command.Parameters.Clear();
                                command.Parameters.AddWithValue("@curso_id", item.Id);
                                command.Parameters.AddWithValue("@capacidad_id", capacidadCurso.CapacidadId);
                                command.Parameters.AddWithValue("@nivelMinimo", capacidadCurso.NivelMinimo.Id);
                                command.Parameters.AddWithValue("@nivelMaximo", capacidadCurso.NivelMaximo.Id);
                                command.Parameters.AddWithValue("@nivelEsperado", capacidadCurso.NivelEsperado.Id);
                                command.ExecuteNonQuery();
                            }
                        }
                    }
                    transaccion.Commit();
                }
                catch (Exception ex)
                {
                    if (transaccion != null) transaccion.Rollback();
                    throw new DALException(ex.Message);
                }
            }
        }

        public void GuardarOActualizar(Curso item)
        {

        }

        public void Actualizar(Curso item)
        {
            DALSqlServerConnection conexion = new DALSqlServerConnection();
            SqlTransaction transaccion = null;

            using (SqlConnection connection = conexion.Conexion)
            {
                try
                {
                    transaccion = connection.BeginTransaction();

                    using (SqlCommand command = connection.CreateCommand())
                    {
                        command.CommandType = CommandType.StoredProcedure;
                        command.CommandText = "PA_ADUS_Cursos_actualizar";
                        command.Transaction = transaccion;
                        command.Parameters.AddWithValue("@curso_id", item.Id);
                        command.Parameters.AddWithValue("@nombre", item.Nombre);
                        command.Parameters.AddWithValue("@descripcion", item.Descripcion);
                        command.Parameters.AddWithValue("@responsablePropuesta", item.ResponsablePropuesta.IdColaborador);
                        command.Parameters.AddWithValue("@responsableDictado", item.ResponsableDictado.Id);
                        command.Parameters.AddWithValue("@tipoCurso_id", item.Tipo.Id);
                        command.Parameters.AddWithValue("@cantidadHoras", item.CantidadHoras);
                        if (item.FechaInicio != DateTime.MinValue) command.Parameters.AddWithValue("@fechaInicio", item.FechaInicio);
                        else command.Parameters.AddWithValue("@fechaInicio", DBNull.Value);
                        if (item.FechaFin != DateTime.MinValue) command.Parameters.AddWithValue("@fechaFin", item.FechaFin);
                        else command.Parameters.AddWithValue("@fechaFin", DBNull.Value);

                        command.ExecuteNonQuery();
                        command.Parameters.Clear();

                        command.CommandText = "PA_ADUS_Cursos_borrarCapacidades";
                        command.Parameters.AddWithValue("@curso_id", item.Id);
                        command.ExecuteNonQuery();

                        if (item.ContarCapacidades() > 0)
                        {
                            command.CommandText = "PA_ADUS_Cursos_insertarCapacidades";
                            foreach (CapacidadCurso capacidadCurso in item.Capacidades)
                            {
                                command.Parameters.Clear();
                                command.Parameters.AddWithValue("@curso_id", item.Id);
                                command.Parameters.AddWithValue("@capacidad_id", capacidadCurso.CapacidadId);
                                command.Parameters.AddWithValue("@nivelMinimo", capacidadCurso.NivelMinimo.Id);
                                command.Parameters.AddWithValue("@nivelMaximo", capacidadCurso.NivelMaximo.Id);
                                command.Parameters.AddWithValue("@nivelEsperado", capacidadCurso.NivelEsperado.Id);
                                command.ExecuteNonQuery();
                            }
                        }
                    }
                    transaccion.Commit();
                }
                catch (Exception ex)
                {
                    if (transaccion != null) transaccion.Rollback();
                    throw new DALException(ex.Message);
                }
            }
        }

        public void Borrar(Curso item) { }

        public void Activar(Curso item) 
        {
            try
            {
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure( "PA_ADUS_Curso_activar");
                stored.AgregarParametro("@curso_id", item.Id);
                stored.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void Desactivar(Curso item) 
        {
            try
            {
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure( "PA_ADUS_Curso_desactivar");
                stored.AgregarParametro("@curso_id", item.Id);
                stored.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            
        }

        public List<Curso> BuscarTodos() 
        {
            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure( "PA_ADUS_Cursos_BuscarTodos");
            return CargaLista(stored.ExecuteDataTable());
        }

        private List<Curso> CargaLista(DataTable dt)
        {
            List<Curso> cursos = new List<Curso>();

            foreach (DataRow row in dt.Rows)
            {
                Curso curso = new Curso();
                if (row["curso_id"] != DBNull.Value) curso.Id = Convert.ToInt64(row["curso_id"]);
                if (row["nombre"] != DBNull.Value) curso.Nombre = row["nombre"].ToString();
                if (row["descripcion"] != DBNull.Value) curso.Descripcion = row["descripcion"].ToString();
                if (row["tipoCurso_id"] != DBNull.Value) curso.Tipo = new TipoCurso(Convert.ToInt64(row["tipoCurso_id"]), string.Empty, string.Empty);
                if (row["responsableDictado"] != DBNull.Value) curso.ResponsableDictado = new Persona(Convert.ToInt64(row["responsableDictado"]), string.Empty, string.Empty);
                if (row["responsablePropuesta"] != DBNull.Value) curso.ResponsablePropuesta = new Colaborador(Convert.ToInt64(row["responsablePropuesta"]));
                if (row["cantidadHoras"] != DBNull.Value) curso.CantidadHoras = short.Parse(row["cantidadHoras"].ToString());
                if (row["fechaInicio"] != DBNull.Value) curso.FechaInicio = Convert.ToDateTime(row["fechaInicio"]);
                if (row["fechaFin"] != DBNull.Value) curso.FechaFin = Convert.ToDateTime(row["fechaFin"]);
                if (row["fechaBaja"] != DBNull.Value) curso.FechaBaja = Convert.ToDateTime(row["fechaBaja"]);
                cursos.Add(curso);
            }

            return cursos;
        }


        #endregion
    }
}
